package sta02;

public class test {
    public static void main(String[] args) {
        //创建对象（多态方式）
        Animal animal = new Dog();
        //成员变量
        //编译看左边，运行看左边
        //编译看左边：java编译器在编译代码时，会检查左边的父类中有没有这个变量，如果有就通过编译，否则就会报错。
        //运行看左边：在运行时，实际上是在执行父类中的变量，因为子类中没有这个变量，所以会输出父类中的变量值。

        System.out.println(animal.name);//动物

        //成员方法
        //编译看左边，运行看右边
        //编译看左边：java编译器在编译代码时，会检查左边的父类中有没有这个方法，如果有就通过编译，否则就会报错。
        //运行看右边：在运行时，实际上是在执行子类中的方法，因为子类中重写了这个方法，所以会输出子类中的方法值。

        animal.show();//Dog-----show方法

        //理解
        //Animal animal = new Dog();
        //现在用animal类型的，所以默认都会从父类Animal中找

        //成员变量：在子类的对象中，从父类的成员位置查找，无论是否有重写，都只看左边（父类）
        //成员方法：如果子类对方法进行了重写，那么在虚方法表中是会把父类的方法覆盖掉，只保留子类的方法，
        //所以在运行时，调用的是子类的方法，所以看右边（子类）
    }
}
class Animal {
    String name="动物";

    public void show(){
        System.out.println("Animal-----show方法");
    }
}
class Dog extends Animal{
    String name="狗";
    @Override
    public void show(){
        System.out.println("Dog-----show方法");
    }
}
